package com.pan.structual.facade;

import com.pan.structual.facade.facade.DrawFacade;
import com.pan.structual.facade.facade.impl.DrawShapeAndTextFacade;
import com.pan.structual.facade.facade.impl.DrawTextInShapeFacade;

import java.awt.*;

/**
 * 外观模式
 *
 * 优点：
 *
 * 简化接口：外观模式为复杂的子系统提供了一个统一的接口，使得客户端无需了解底层的复杂性，从而简化了系统的使用。
 * 减少依赖：客户端只与外观类交互，从而减少了对底层类的依赖和耦合度，这有助于提高系统的模块性和可维护性。
 * 更好的分离关注点：外观模式将系统的内部实现与外部接口分离，使得内部的变化不会影响到使用外观类的客户端。
 * 易于扩展和维护：由于外观类封装了对子系统的访问，因此对子系统的修改或扩展不会影响到外观类，这有助于保持系统的稳定和灵活性。
 * 缺点：
 *
 * 增加系统复杂度：虽然外观模式简化了客户端与系统的交互，但在系统中引入一个新的外观类会增加系统的复杂度。
 * 可能违反开闭原则：如果频繁地对外观类进行修改以满足新的需求，那么可能会违反开闭原则，因为理想的外观类应该对扩展开放，对修改封闭。
 * 可能降低系统的灵活性：外观模式可能会限制客户端直接与子系统交互的能力，这可能会导致系统在特定情况下缺乏灵活性。
 *
 *
 */

public class FacadeApplication {
    public static void main(String[] args) {
        DrawFacade drawFacade = new DrawShapeAndTextFacade();

        drawFacade.printShape("circle", Color.RED,"ShapeAndText");



        drawFacade = new DrawTextInShapeFacade();
        drawFacade.printShape("square",Color.BLUE,"TextInShape");

    }
}
